package destiny.预测;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import destiny.五行.五行;

public class Utils {

	public static 成局[] 成局集(干支数[] 柱数) {
		List<成局> 局 = new ArrayList<成局>();
		String id = null;

		Set<String> temp = new HashSet<String>();
		for (int i = 0; i < 柱数.length; ++i) {
			for (成局 ju : 柱数[i].干数().成局()) {
				id = String.format("%s%d", ju.局(), ju.getId());
				if (temp.contains(id))
					continue;

				temp.add(id);

				局.add(ju);
			}
		}
		temp = new HashSet<String>();
		for (int i = 0; i < 柱数.length; ++i) {
			for (成局 ju : 柱数[i].支数().成局()) {
				id = String.format("%s%d", ju.局(), ju.getId());
				if (temp.contains(id))
					continue;

				temp.add(id);

				局.add(ju);
			}
		}
		return (成局[]) 局.toArray(new 成局[局.size()]);
	}

	public static Map<五行, Integer> 五行用神数(干支数[] 柱数) {
		/*
		 * 生克排局已毕，五行平衡
		 */
		Map<五行, Integer> 用神数 = new HashMap<五行, Integer>();

		五行 ele;
		int weight;
		for (int i = 0; i < 柱数.length; ++i) {
			干数 x = 柱数[i].干数();
			ele = x.术数().五行();
			weight = 0;
			if (用神数.containsKey(ele)) {
				weight = 用神数.get(ele);
			}
			weight += x.getWeight();

			用神数.put(ele, weight);

			for (干数 y : 柱数[i].支数().藏干数()) {
				ele = y.术数().五行();
				weight = 0;
				if (用神数.containsKey(ele)) {
					weight = 用神数.get(ele);
				}
				weight += y.getWeight();

				用神数.put(ele, weight);
			}
		}

		if (Consts._DEBUG) {
			System.out.println("== 五行权重 ==");
			for (五行 e : 用神数.keySet()) {
				System.out.println(String.format("\t%s：%d", e, 用神数.get(e)));
			}
		}
		return 用神数;
	}

	public static void 用神(运神 用神, 干支数[] 柱数) {
		for (int i = 0; i < 柱数.length; ++i) {
			for (干数 数 : 柱数[i].支数().藏干数()) {
				int idx = 0;
				for (五行 ele : 用神.用神集()) {
					if (ele.equals(数.术数().五行())) {
						数.用神权重(5 - idx);
					}
					++idx;
				}
			}

			if (i == Consts.四柱日序)
				continue;
			干数 干数 = 柱数[i].干数();
			int idx = 0;
			for (五行 ele : 用神.用神集()) {
				if (ele.equals(干数.术数().五行())) {
					干数.用神权重(5 - idx);
				}
				++idx;
			}
		}
	}
}
